前言
本题知识点:SQL堆叠注入 & sql_mode
WP
打开题目页面是熟悉的 SQL 注入界面
既然是 SQL 注入,那么还是先按照大概的流程试试基本的探测姿势
一番尝试后,发现共有三种可能的回显,分别为 ‘Nonono.’,空以及返回 Array。并且大部分的关键字都被过滤掉了,故考虑堆叠注入
又经过一番努力,发现基本上我会的方法都被过滤掉了。。。
查了查网上的 WP,没想到口径还挺统一的,似乎是比赛时这题泄露了源码。。。题目的关键查询代码如下:
1 | select $_GET['query'] || flag from flag |
发现就算看了源码还是没啥思路(捂脸), 只好从 payload 中反推一下解题的思路,payload 如下:
1 | 1;set sql_mode=PIPES_AS_CONCAT;select 1 |
把它放入题目的查询语句,拼接一下:
1 | select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag |
关于 sql_mode
sql_mode 定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的 PIPES_AS_CONCAT 将 || 视为字符串的连接操作符而非 “或” 运算符
大概就是未配置 sql_mode 之前,|| 是作为 或 运算符,当前面一个字段查询到数据时,后面一个字段的查询就不会再执行。当调整 sql_mode 后,|| 就相当于字符串拼接符,相当于是将前一个字段(例如:select 1 from Flag)和后一个字段(例如:select flag from Flag)的查询结果拼接在一起
PS:
除了上述官方给出的 payload 之外,众多 WP 还提到了一个同样可以得到 flag 的非预期解 *,1
,把它放入题目的查询语句,拼接一下就成了:
1 | select *,1||flag from Flag |